package com.lz.netty.producer.project.netty;

import com.alibaba.fastjson2.JSON;
import com.lz.netty.producer.common.utils.DateUtils;
import com.lz.netty.producer.project.netty.util.MsgUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpRequest;
import lombok.extern.slf4j.Slf4j;

/**
 * @author Administrator
 */
@Slf4j
public class MyServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 当客户端主动链接服务端的链接后，这个通道就是活跃的了。也就是客户端与服务端建立了通信通道并且可以传输数据
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        boolean c = ctx.channel().isRegistered();
        //保存频道
        ChannelStore.bind(ctx, String.valueOf(ctx.channel().id()));

        SocketChannel channel = (SocketChannel) ctx.channel();
        log.info("服务端链接报告开始");
        log.info("服务端链接报告信息：有一客户端链接到本服务端。channelId：{}", channel.id());
        log.info("服务端链接报告IP:{}", channel.localAddress().getHostString());
        log.info("服务端链接报告Port:{}", channel.localAddress().getPort());
        log.info("服务端链接报告完毕");
        //通知客户端链接建立成功
        String str = "服务端连接成功回调通知客户端，时间：" + DateUtils.getCurr_YYYY_MM_DD_HH_MM_SS_SSS() + ", 地址：" + channel.localAddress().getHostString();
        ctx.writeAndFlush(MsgUtil.buildMsg(channel.id().toString(), str));

    }

    /**
     * 当客户端主动断开服务端的链接后，这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        ChannelStore.closeAndClean(ctx);
        log.warn("服务端列表中：客户端{} 断开链接", ctx.channel().localAddress().toString());
    }

    /**
     * 读取客户端发来的信息
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //接收msg消息
        log.info("服务端接收到消息类型：{}，时间:{}", msg.getClass(), DateUtils.getCurr_YYYY_MM_DD_HH_MM_SS_SSS());
        log.info("服务端消息内容：{}，时间:{}", JSON.toJSONString(msg), DateUtils.getCurr_YYYY_MM_DD_HH_MM_SS_SSS());
    }

    /**
     * 抓住异常，当发生异常的时候，可以做一些相应的处理，比如打印日志、关闭链接
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
        log.error("服务端Handler异常信息：\r\n{}", cause.getMessage());
    }
}
